home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MoreKittiesPlease / Source / DLPIUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  35.6 KB  |  790 lines

  1.  
  2. #ifndef qDebug
  3. #define qDebug    1
  4. #endif
  5.  
  6. #import "DebugFlags.h"
  7.  
  8. #import <OpenTptModule.h>
  9.  
  10. #import <dlpi.h>
  11. #import <tihdr.h>
  12. #import <mistream.h>
  13. #import <string.h>
  14. #import "DLPIUtils.h"
  15. #import "OTDCon.h"
  16.  
  17. enum {
  18.     kNoPrimitive = -1
  19. };
  20.  
  21. asm void __ptr_glue(void)
  22. {
  23.         smclass    GL
  24.         lwz        r0,0(r12)
  25.         stw        RTOC,20(SP)
  26.         mtctr    r0
  27.         lwz        RTOC,4(r12)
  28.         bctr
  29. }
  30.  
  31.  
  32. const char *TypeToString( UInt32 type )
  33. {
  34.     static    char    typeString[256];
  35.     switch ( type )
  36.         {
  37.         case M_DATA            :    BlockMoveData( "M_DATA", typeString, strlen( "M_DATA" )+1 );    break;
  38.         case M_PROTO         :    BlockMoveData( "M_PROTO", typeString, strlen( "M_PROTO" )+1 );    break;
  39.         case M_BREAK         :    BlockMoveData( "M_BREAK", typeString, strlen( "M_BREAK" )+1 );    break;
  40.         case M_PASSFP        :    BlockMoveData( "M_PASSFP", typeString, strlen( "M_PASSFP" )+1 );    break;
  41.         case M_SIG            :    BlockMoveData( "M_SIG", typeString, strlen( "M_SIG" )+1 );    break;
  42.         case M_DELAY         :    BlockMoveData( "M_DELAY", typeString, strlen( "M_DELAY" )+1 );    break;
  43.         case M_CTL            :    BlockMoveData( "M_CTL", typeString, strlen( "M_CTL" )+1 );    break;
  44.         case M_IOCTL         :    BlockMoveData( "M_IOCTL", typeString, strlen( "M_IOCTL" )+1 );    break;
  45.         case M_SETOPTS        :    BlockMoveData( "M_SETOPTS", typeString, strlen( "M_SETOPTS" )+1 );    break;
  46.         case M_RSE            :    BlockMoveData( "M_RSE", typeString, strlen( "M_RSE" )+1 );    break;
  47.         case QPCTL            :    BlockMoveData( "QPCTL", typeString, strlen( "QPCTL" )+1 );    break;
  48.         case M_IOCACK        :    BlockMoveData( "M_IOCACK", typeString, strlen( "M_IOCACK" )+1 );    break;
  49.         case M_IOCNAK        :    BlockMoveData( "M_IOCNAK", typeString, strlen( "M_IOCNAK" )+1 );    break;
  50.         case M_PCPROTO        :    BlockMoveData( "M_PCPROTO", typeString, strlen( "M_PCPROTO" )+1 );    break;
  51.         case M_PCSIG         :    BlockMoveData( "M_PCSIG", typeString, strlen( "M_PCSIG" )+1 );    break;
  52.         case M_FLUSH         :    BlockMoveData( "M_FLUSH", typeString, strlen( "M_FLUSH" )+1 );    break;
  53.         case M_STOP            :    BlockMoveData( "M_STOP", typeString, strlen( "M_STOP" )+1 );    break;
  54.         case M_START         :    BlockMoveData( "M_START", typeString, strlen( "M_START" )+1 );    break;
  55.         case M_HANGUP        :    BlockMoveData( "M_HANGUP", typeString, strlen( "M_HANGUP" )+1 );    break;
  56.         case M_ERROR         :    BlockMoveData( "M_ERROR", typeString, strlen( "M_ERROR" )+1 );    break;
  57.         case M_READ            :    BlockMoveData( "M_READ", typeString, strlen( "M_READ" )+1 );    break;
  58.         case M_COPYIN        :    BlockMoveData( "M_COPYIN", typeString, strlen( "M_COPYIN" )+1 );    break;
  59.         case M_COPYOUT        :    BlockMoveData( "M_COPYOUT", typeString, strlen( "M_COPYOUT" )+1 );    break;
  60.         case M_IOCDATA        :    BlockMoveData( "M_IOCDATA", typeString, strlen( "M_IOCDATA" )+1 );    break;
  61.         case M_PCRSE         :    BlockMoveData( "M_PCRSE", typeString, strlen( "M_PCRSE" )+1 );    break;
  62.         case M_STOPI         :    BlockMoveData( "M_STOPI", typeString, strlen( "M_STOPI" )+1 );    break;
  63.         case M_STARTI        :    BlockMoveData( "M_STARTI", typeString, strlen( "M_STARTI" )+1 );    break;
  64.         case M_HPDATA        :    BlockMoveData( "M_HPDATAM_HPDATA", typeString, strlen( "M_HPDATA" )+1 );    break;
  65.         default:
  66.             BlockMoveData( "Unknown type", typeString, strlen( "Unknown type    " )+1 );
  67.             break;
  68.         }
  69.     return typeString;
  70. }
  71.  
  72. const char *ErrorAckCodeToString( UInt32 code )
  73. {
  74.     static    char    errorString[255];
  75.     
  76.     switch ( code )
  77.         {
  78.         case DL_ACCESS        :    BlockMoveData( "DL_ACCESS",         errorString, strlen( "DL_ACCESS" )+1 );            break;
  79.         case DL_BADADDR        :    BlockMoveData( "DL_BADADDR",         errorString, strlen( "DL_BADADDR" )+1 );        break;
  80.         case DL_BADCORR        :    BlockMoveData( "DL_BADCORR",         errorString, strlen( "DL_BADCORR" )+1 );        break;
  81.         case DL_BADDATA        :    BlockMoveData( "DL_BADDATA",         errorString, strlen( "DL_BADDATA" )+1 );        break;
  82.         case DL_BADPPA        :    BlockMoveData( "DL_BADPPA",         errorString, strlen( "DL_BADPPA" )+1 );            break;
  83.         case DL_BADPRIM        :    BlockMoveData( "DL_BADPRIM",        errorString, strlen( "DL_BADPRIM" )+1 );        break;
  84.         case DL_BADQOSPARAM    :    BlockMoveData( "DL_BADQOSPARAM",     errorString, strlen( "DL_BADQOSPARAM" )+1 );    break;
  85.         case DL_BADQOSTYPE    :    BlockMoveData( "DL_BADQOSTYPE",     errorString, strlen( "DL_BADQOSTYPE" )+1 );        break;
  86.         case DL_BADSAP        :    BlockMoveData( "DL_BADSAP",         errorString, strlen( "DL_BADSAP" )+1 );            break;
  87.         case DL_BADTOKEN     :    BlockMoveData( "DL_BADTOKEN",         errorString, strlen( "DL_BADTOKEN" )+1 );        break;
  88.         case DL_BOUND        :    BlockMoveData( "DL_BOUND",             errorString, strlen( "DL_BOUND" )+1 );            break;
  89.         case DL_INITFAILED    :    BlockMoveData( "DL_INITFAILED",     errorString, strlen( "DL_INITFAILED" )+1 );        break;
  90.         case DL_NOADDR        :    BlockMoveData( "DL_NOADDRDL_NOADDR", errorString, strlen( "DL_INFO_REQ" )+1 );        break;
  91.         case DL_NOTINIT        :    BlockMoveData( "DL_NOTINIT",         errorString, strlen( "DL_NOTINIT" )+1 );        break;
  92.         case DL_OUTSTATE     :    BlockMoveData( "DL_OUTSTATE",         errorString, strlen( "DL_OUTSTATE" )+1 );        break;
  93.         case DL_SYSERR        :    BlockMoveData( "DL_SYSERR",         errorString, strlen( "DL_SYSERR" )+1 );            break;
  94.         case DL_UNSUPPORTED    :    BlockMoveData( "DL_UNSUPPORTED",     errorString, strlen( "DL_UNSUPPORTED" )+1 );    break;
  95.         case DL_UNDELIVERABLE :    BlockMoveData( "DL_UNDELIVERABLE",     errorString, strlen( "DL_UNDELIVERABLE" )+1 );    break;
  96.         case DL_NOTSUPPORTED  :    BlockMoveData( "DL_NOTSUPPORTED",     errorString, strlen( "DL_NOTSUPPORTED" )+1 );    break;
  97.         case DL_TOOMANY        :    BlockMoveData( "DL_TOOMANY",         errorString, strlen( "DL_TOOMANY" )+1 );        break;
  98.         case DL_NOTENAB        :    BlockMoveData( "DL_NOTENAB",         errorString, strlen( "DL_NOTENAB" )+1 );        break;
  99.         case DL_BUSY         :    BlockMoveData( "DL_BUSY",             errorString, strlen( "DL_BUSY" )+1 );            break;
  100.         case DL_NOAUTO        :    BlockMoveData( "DL_NOAUTO",         errorString, strlen( "DL_NOAUTO" )+1 );            break;
  101.         case DL_NOXIDAUTO    :    BlockMoveData( "DL_NOXIDAUTO",         errorString, strlen( "DL_NOXIDAUTO" )+1 );        break;
  102.         case DL_NOTESTAUTO    :    BlockMoveData( "DL_NOTESTAUTO",     errorString, strlen( "DL_NOTESTAUTO" )+1 );        break;
  103.         case DL_XIDAUTO        :    BlockMoveData( "DL_XIDAUTO",         errorString, strlen( "DL_XIDAUTO" )+1 );        break;
  104.         case DL_TESTAUTO     :    BlockMoveData( "DL_TESTAUTO",         errorString, strlen( "DL_TESTAUTO" )+1 );        break;
  105.         case DL_PENDING        :    BlockMoveData( "DL_PENDING",         errorString, strlen( "DL_PENDING" )+1 );        break;
  106.         }
  107.     return errorString;
  108. }
  109.  
  110. const char *PrimitiveToString( UInt32 primitive )
  111. {
  112.     static    char    primitiveString[256];
  113.     
  114.     switch ( primitive )
  115.         {
  116.         case DL_INFO_REQ         :    BlockMoveData( "DL_INFO_REQ", primitiveString, strlen( "DL_INFO_REQ" )+1 );    break;
  117.         case DL_INFO_ACK         :    BlockMoveData( "DL_INFO_ACK", primitiveString, strlen( "DL_INFO_ACK" )+1 );    break;
  118.         case DL_ATTACH_REQ        :    BlockMoveData( "DL_ATTACH_REQ", primitiveString, strlen( "DL_ATTACH_REQ" )+1 );    break;
  119.         case DL_DETACH_REQ        :    BlockMoveData( "DL_DETACH_REQ", primitiveString, strlen( "DL_DETACH_REQ" )+1 );    break;
  120.         case DL_BIND_REQ         :    BlockMoveData( "DL_BIND_REQ", primitiveString, strlen( "DL_BIND_REQ" )+1 );    break;
  121.         case DL_BIND_ACK         :    BlockMoveData( "DL_BIND_ACK", primitiveString, strlen( "DL_BIND_ACK" )+1 );    break;
  122.         case DL_UNBIND_REQ        :    BlockMoveData( "DL_UNBIND_REQ", primitiveString, strlen( "DL_UNBIND_REQ" )+1 );    break;
  123.         case DL_OK_ACK            :    BlockMoveData( "DL_OK_ACK", primitiveString, strlen( "DL_OK_ACK" )+1 );    break;
  124.         case DL_ERROR_ACK        :    BlockMoveData( "DL_ERROR_ACK", primitiveString, strlen( "DL_ERROR_ACK" )+1 );    break;
  125.         case DL_SUBS_BIND_REQ    :    BlockMoveData( "DL_SUBS_BIND_REQ", primitiveString, strlen( "DL_SUBS_BIND_REQ" )+1 );    break;
  126.         case DL_SUBS_BIND_ACK    :    BlockMoveData( "DL_SUBS_BIND_ACK", primitiveString, strlen( "DL_SUBS_BIND_ACK" )+1 );    break;
  127.         case DL_SUBS_UNBIND_REQ    :    BlockMoveData( "DL_SUBS_UNBIND_REQ", primitiveString, strlen( "DL_SUBS_UNBIND_REQ" )+1 );    break;
  128.         case DL_ENABMULTI_REQ    :    BlockMoveData( "DL_ENABMULTI_REQ", primitiveString, strlen( "DL_ENABMULTI_REQ" )+1 );    break;
  129.         case DL_DISABMULTI_REQ    :    BlockMoveData( "DL_DISABMULTI_REQ", primitiveString, strlen( "DL_DISABMULTI_REQ" )+1 );    break;
  130.         case DL_PROMISCON_REQ    :    BlockMoveData( "DL_PROMISCON_REQ", primitiveString, strlen( "DL_PROMISCON_REQ" )+1 );    break;
  131.         case DL_PROMISCOFF_REQ    :    BlockMoveData( "DL_PROMISCOFF_REQ", primitiveString, strlen( "DL_PROMISCOFF_REQ" )+1 );    break;
  132.  
  133. /*
  134.  * Primitives used for Connectionless Service
  135.  */
  136.         case DL_UNITDATA_REQ     :    BlockMoveData( "DL_UNITDATA_REQ", primitiveString, strlen( "DL_UNITDATA_REQ" )+1 );    break;
  137.         case DL_UNITDATA_IND     :    BlockMoveData( "DL_UNITDATA_IND", primitiveString, strlen( "DL_UNITDATA_IND" )+1 );    break;
  138.         case DL_UDERROR_IND        :    BlockMoveData( "DL_UDERROR_IND", primitiveString, strlen( "DL_UDERROR_IND" )+1 );    break;
  139.         case DL_UDQOS_REQ        :    BlockMoveData( "DL_UDQOS_REQ", primitiveString, strlen( "DL_UDQOS_REQ" )+1 );    break;
  140.  
  141. /*
  142.  * Primitives used for Connection-Oriented Service
  143.  */
  144.         case DL_CONNECT_REQ        :    BlockMoveData( "DL_CONNECT_REQ", primitiveString, strlen( "DL_CONNECT_REQ" )+1 );    break;
  145.         case DL_CONNECT_IND        :    BlockMoveData( "DL_CONNECT_IND", primitiveString, strlen( "DL_CONNECT_IND" )+1 );    break;
  146.         case DL_CONNECT_RES        :    BlockMoveData( "DL_CONNECT_RES", primitiveString, strlen( "DL_CONNECT_RES" )+1 );    break;
  147.         case DL_CONNECT_CON        :    BlockMoveData( "DL_CONNECT_RES", primitiveString, strlen( "DL_CONNECT_RES" )+1 );    break;
  148.  
  149.         case DL_TOKEN_REQ        :    BlockMoveData( "DL_TOKEN_REQ", primitiveString, strlen( "DL_TOKEN_REQ" )+1 );    break;
  150.         case DL_TOKEN_ACK        :    BlockMoveData( "DL_TOKEN_ACK", primitiveString, strlen( "DL_TOKEN_ACK" )+1 );    break;
  151.  
  152.         case DL_DISCONNECT_REQ    :    BlockMoveData( "DL_DISCONNECT_REQ", primitiveString, strlen( "DL_DISCONNECT_REQ" )+1 );    break;
  153.         case DL_DISCONNECT_IND    :    BlockMoveData( "DL_DISCONNECT_IND", primitiveString, strlen( "DL_DISCONNECT_IND" )+1 );    break;
  154.  
  155.         case DL_RESET_REQ        :    BlockMoveData( "DL_RESET_REQ", primitiveString, strlen( "DL_RESET_REQ" )+1 );    break;
  156.         case DL_RESET_IND        :    BlockMoveData( "DL_RESET_IND", primitiveString, strlen( "DL_RESET_IND" )+1 );    break;
  157.         case DL_RESET_RES        :    BlockMoveData( "DL_RESET_RES", primitiveString, strlen( "DL_RESET_RES" )+1 );    break;
  158.         case DL_RESET_CON        :    BlockMoveData( "DL_RESET_CON", primitiveString, strlen( "DL_RESET_CON" )+1 );    break;
  159.  
  160. /*
  161.  *    Primitives used for Acknowledged Connectionless Service
  162.  */
  163.  
  164.         case DL_DATA_ACK_REQ             :    BlockMoveData( "DL_DATA_ACK_REQ", primitiveString, strlen( "DL_DATA_ACK_REQ" )+1 );    break;
  165.         case DL_DATA_ACK_IND             :    BlockMoveData( "DL_DATA_ACK_IND", primitiveString, strlen( "DL_DATA_ACK_IND" )+1 );    break;
  166.         case DL_DATA_ACK_STATUS_IND        :    BlockMoveData( "DL_DATA_ACK_STATUS_IND", primitiveString, strlen( "DL_DATA_ACK_STATUS_IND" )+1 );    break;
  167.         case DL_REPLY_REQ                :    BlockMoveData( "DL_REPLY_REQ", primitiveString, strlen( "DL_REPLY_REQ" )+1 );    break;
  168.         case DL_REPLY_IND                :    BlockMoveData( "DL_REPLY_IND", primitiveString, strlen( "DL_REPLY_IND" )+1 );    break;
  169.         case DL_REPLY_STATUS_IND         :    BlockMoveData( "DL_REPLY_STATUS_IND", primitiveString, strlen( "DL_REPLY_STATUS_IND" )+1 );    break;
  170.         case DL_REPLY_UPDATE_REQ         :    BlockMoveData( "DL_REPLY_UPDATE_REQ", primitiveString, strlen( "DL_REPLY_UPDATE_REQ" )+1 );    break;
  171.         case DL_REPLY_UPDATE_STATUS_IND    :    BlockMoveData( "DL_REPLY_UPDATE_STATUS_IND", primitiveString, strlen( "DL_REPLY_UPDATE_STATUS_IND" )+1 );    break;
  172.  
  173. /*
  174.  * Primitives used for XID and TEST operations
  175.  */
  176.  
  177.         case DL_XID_REQ        :    BlockMoveData( "DL_XID_REQ", primitiveString, strlen( "DL_XID_REQ" )+1 );    break;
  178.         case DL_XID_IND        :    BlockMoveData( "DL_XID_IND", primitiveString, strlen( "DL_XID_IND" )+1 );    break;
  179.         case DL_XID_RES        :    BlockMoveData( "DL_XID_RES", primitiveString, strlen( "DL_XID_RES" )+1 );    break;
  180.         case DL_XID_CON        :    BlockMoveData( "DL_XID_CON", primitiveString, strlen( "DL_XID_CON" )+1 );    break;
  181.         case DL_TEST_REQ     :    BlockMoveData( "DL_TEST_REQ", primitiveString, strlen( "DL_TEST_REQ" )+1 );    break;
  182.         case DL_TEST_IND     :    BlockMoveData( "DL_TEST_IND", primitiveString, strlen( "DL_TEST_IND" )+1 );    break;
  183.         case DL_TEST_RES     :    BlockMoveData( "DL_TEST_RES", primitiveString, strlen( "DL_TEST_RES" )+1 );    break;
  184.         case DL_TEST_CON     :    BlockMoveData( "DL_TEST_CON", primitiveString, strlen( "DL_TEST_CON" )+1 );    break;
  185.  
  186. /*
  187.  * Primitives to get and set the physical address, and to get
  188.  * Statistics
  189.  */
  190.  
  191.         case DL_PHYS_ADDR_REQ        :    BlockMoveData( "DL_PHYS_ADDR_REQ", primitiveString, strlen( "DL_PHYS_ADDR_REQ" )+1 );    break;
  192.         case DL_PHYS_ADDR_ACK        :    BlockMoveData( "DL_PHYS_ADDR_ACK", primitiveString, strlen( "DL_PHYS_ADDR_ACK" )+1 );    break;
  193.         case DL_SET_PHYS_ADDR_REQ    :    BlockMoveData( "DL_SET_PHYS_ADDR_REQ", primitiveString, strlen( "DL_SET_PHYS_ADDR_REQ" )+1 );    break;
  194.         case DL_GET_STATISTICS_REQ    :    BlockMoveData( "DL_GET_STATISTICS_REQ", primitiveString, strlen( "DL_GET_STATISTICS_REQ" )+1 );    break;
  195.         case DL_GET_STATISTICS_ACK    :    BlockMoveData( "DL_GET_STATISTICS_ACK", primitiveString, strlen( "DL_GET_STATISTICS_ACK" )+1 );    break;
  196.  
  197. /*
  198.     TPI primitives.  I don't know why we are getting them, but we are.
  199. */
  200. /* User generated requests */
  201.         case T_BIND_REQ                :    BlockMoveData( "T_BIND_REQ", primitiveString, strlen( "T_BIND_REQ" )+1 );    break;
  202.         case T_CONN_REQ                :    BlockMoveData( "T_CONN_REQ", primitiveString, strlen( "T_CONN_REQ" )+1 );    break;
  203.         case T_CONN_RES                :    BlockMoveData( "T_CONN_RES", primitiveString, strlen( "T_CONN_RES" )+1 );    break;
  204.         case T_DATA_REQ                :    BlockMoveData( "T_DATA_REQ", primitiveString, strlen( "T_DATA_REQ" )+1 );    break;
  205.         case T_DISCON_REQ            :    BlockMoveData( "T_DISCON_REQ", primitiveString, strlen( "T_DISCON_REQ" )+1 );    break;
  206.         case T_EXDATA_REQ            :    BlockMoveData( "T_EXDATA_REQ", primitiveString, strlen( "T_EXDATA_REQ" )+1 );    break;
  207.         case T_INFO_REQ                :    BlockMoveData( "T_INFO_REQ", primitiveString, strlen( "T_INFO_REQ" )+1 );    break;
  208.         case T_OPTMGMT_REQ            :    BlockMoveData( "T_OPTMGMT_REQ", primitiveString, strlen( "T_OPTMGMT_REQ" )+1 );    break;
  209.         case T_ORDREL_REQ            :    BlockMoveData( "T_ORDREL_REQ", primitiveString, strlen( "T_ORDREL_REQ" )+1 );    break;
  210.         case T_UNBIND_REQ            :    BlockMoveData( "T_UNBIND_REQ", primitiveString, strlen( "T_UNBIND_REQ" )+1 );    break;
  211.         case T_UNITDATA_REQ            :    BlockMoveData( "T_UNITDATA_REQ", primitiveString, strlen( "T_UNITDATA_REQ" )+1 );    break;
  212.         case T_ADDR_REQ                :    BlockMoveData( "T_ADDR_REQ", primitiveString, strlen( "T_ADDR_REQ" )+1 );    break;        /* Get address request                */
  213.         case T_UREQUEST_REQ            :    BlockMoveData( "T_UREQUEST_REQ", primitiveString, strlen( "T_UREQUEST_REQ" )+1 );    break;
  214.         case T_REQUEST_REQ            :    BlockMoveData( "T_REQUEST_REQ", primitiveString, strlen( "T_REQUEST_REQ" )+1 );    break;
  215.         case T_UREPLY_REQ            :    BlockMoveData( "T_UREPLY_REQ", primitiveString, strlen( "T_UREPLY_REQ" )+1 );    break;
  216.         case T_REPLY_REQ            :    BlockMoveData( "T_REPLY_REQ", primitiveString, strlen( "T_REPLY_REQ" )+1 );    break;
  217.         case T_CANCELREQUEST_REQ    :    BlockMoveData( "T_CANCELREQUEST_REQ", primitiveString, strlen( "T_CANCELREQUEST_REQ" )+1 );    break;
  218.         case T_CANCELREPLY_REQ        :    BlockMoveData( "T_CANCELREPLY_REQ", primitiveString, strlen( "T_CANCELREPLY_REQ" )+1 );    break;
  219.         case T_REGNAME_REQ            :    BlockMoveData( "T_REGNAME_REQ", primitiveString, strlen( "T_REGNAME_REQ" )+1 );    break;
  220.         case T_DELNAME_REQ            :    BlockMoveData( "T_DELNAME_REQ", primitiveString, strlen( "T_DELNAME_REQ" )+1 );    break;
  221.         case T_LKUPNAME_REQ            :    BlockMoveData( "T_LKUPNAME_REQ", primitiveString, strlen( "T_LKUPNAME_REQ" )+1 );    break;
  222.  
  223. /* Transport generated indications and acknowledgements */
  224.         case T_BIND_ACK                :    BlockMoveData( "T_BIND_ACK", primitiveString, strlen( "T_BIND_ACK" )+1 );    break;
  225.         case T_CONN_CON                :    BlockMoveData( "T_CONN_CON", primitiveString, strlen( "T_CONN_CON" )+1 );    break;
  226.         case T_CONN_IND                :    BlockMoveData( "T_CONN_IND", primitiveString, strlen( "T_CONN_IND" )+1 );    break;
  227.         case T_DATA_IND                :    BlockMoveData( "T_DATA_IND", primitiveString, strlen( "T_DATA_IND" )+1 );    break;
  228.         case T_DISCON_IND            :    BlockMoveData( "T_DISCON_IND", primitiveString, strlen( "T_DISCON_IND" )+1 );    break;
  229.         case T_ERROR_ACK             :    BlockMoveData( "T_ERROR_ACK", primitiveString, strlen( "T_ERROR_ACK" )+1 );    break;
  230.         case T_EXDATA_IND            :    BlockMoveData( "T_EXDATA_IND", primitiveString, strlen( "T_EXDATA_IND" )+1 );    break;
  231.         case T_INFO_ACK                :    BlockMoveData( "T_INFO_ACK", primitiveString, strlen( "T_INFO_ACK" )+1 );    break;
  232.         case T_OK_ACK                :    BlockMoveData( "T_OK_ACK", primitiveString, strlen( "T_OK_ACK" )+1 );    break;
  233.         case T_OPTMGMT_ACK            :    BlockMoveData( "T_OPTMGMT_ACK", primitiveString, strlen( "T_OPTMGMT_ACK" )+1 );    break;
  234.         case T_ORDREL_IND            :    BlockMoveData( "T_ORDREL_IND", primitiveString, strlen( "T_ORDREL_IND" )+1 );    break;
  235.         case T_UNITDATA_IND            :    BlockMoveData( "T_UNITDATA_IND", primitiveString, strlen( "T_UNITDATA_IND" )+1 );    break;
  236.         case T_UDERROR_IND            :    BlockMoveData( "T_UDERROR_IND", primitiveString, strlen( "T_UDERROR_IND" )+1 );    break;
  237.         case T_ADDR_ACK                :    BlockMoveData( "T_ADDR_ACK", primitiveString, strlen( "T_ADDR_ACK" )+1 );    break;
  238.         case T_UREQUEST_IND            :    BlockMoveData( "T_UREQUEST_IND", primitiveString, strlen( "T_UREQUEST_IND" )+1 );    break;
  239.         case T_REQUEST_IND            :    BlockMoveData( "T_REQUEST_IND", primitiveString, strlen( "T_REQUEST_IND" )+1 );    break;
  240.         case T_UREPLY_IND            :    BlockMoveData( "T_UREPLY_IND", primitiveString, strlen( "T_UREPLY_IND" )+1 );    break;
  241.         case T_REPLY_IND            :    BlockMoveData( "T_REPLY_IND", primitiveString, strlen( "T_REPLY_IND" )+1 );    break;
  242.         case T_UREPLY_ACK            :    BlockMoveData( "T_UREPLY_ACK", primitiveString, strlen( "T_UREPLY_ACK" )+1 );    break;
  243.         case T_REPLY_ACK            :    BlockMoveData( "T_REPLY_ACK", primitiveString, strlen( "T_REPLY_ACK" )+1 );    break;
  244.         case T_RESOLVEADDR_REQ        :    BlockMoveData( "T_RESOLVEADDR_REQ", primitiveString, strlen( "T_RESOLVEADDR_REQ" )+1 );    break;
  245.         case T_RESOLVEADDR_ACK        :    BlockMoveData( "T_RESOLVEADDR_ACK", primitiveString, strlen( "T_RESOLVEADDR_ACK" )+1 );    break;
  246.  
  247.         case T_LKUPNAME_CON            :    BlockMoveData( "T_LKUPNAME_CON", primitiveString, strlen( "T_LKUPNAME_CON" )+1 );    break;
  248.         case T_LKUPNAME_RES            :    BlockMoveData( "T_LKUPNAME_RES", primitiveString, strlen( "T_LKUPNAME_RES" )+1 );    break;
  249.         case T_REGNAME_ACK            :    BlockMoveData( "T_REGNAME_ACK", primitiveString, strlen( "T_REGNAME_ACK" )+1 );    break;
  250.         case T_SEQUENCED_ACK        :    BlockMoveData( "T_SEQUENCED_ACK", primitiveString, strlen( "T_SEQUENCED_ACK" )+1 );    break;
  251.  
  252.         case T_EVENT_IND            :    BlockMoveData( "T_EVENT_IND", primitiveString, strlen( "T_EVENT_IND" )+1 );    break;
  253.  
  254.         default:
  255.             BlockMoveData( "Unknown DPLI/TPI code", primitiveString, strlen( "Unknown DPLI/TPI code" )+1 );
  256.             break;
  257.         }
  258.     return primitiveString;
  259. }
  260.  
  261. #define DumpAtOffset( packet, offset, length ) \
  262. do {\
  263.     if ( ((offset) > 0) && ((offset) < 0xffff) ) \
  264.         dprintmem( ((char *)packet) + (offset), (length) ); \
  265. } while(0) \
  266.  
  267. void
  268. DLPIDump_DL_INFO_ACK(dl_info_ack_t *ack)
  269. {
  270.     dprintf( "dl_maxsdu = %d\n", ack->dl_max_sdu);             /* Max bytes in a DLSDU */
  271.     dprintf( "dl_min_sdu = %d\n", ack->dl_min_sdu);             /* Min bytes in a DLSDU */
  272.     dprintf( "dl_addr_length = %d\n", ack->dl_addr_length);         /* length of DLSAP address */
  273.     dprintf( "dl_mac_type = %d\n", ack->dl_mac_type);            /* type of medium supported*/
  274.     dprintf( "dl_reserved = %d\n", ack->dl_reserved);            /* value set to zero */
  275.     dprintf( "dl_current_state = %d\n", ack->dl_current_state);        /* state of DLPI interface */
  276.     dprintf( "dl_sap_length = %d\n", ack->dl_sap_length);            /* current length of SAP part of
  277.                                            dlsap address */
  278.     dprintf( "dl_service_mode = %d\n", ack->dl_service_mode);        /* CO, CL or ACL */
  279.     
  280.     dprintf( "dl_qos_length = %d\n", ack->dl_qos_length);            /* length of qos values */
  281.     dprintf( "dl_qos_offset = %d\n", ack->dl_qos_offset);            /* offset from beg. of block*/
  282.     DumpAtOffset( ack, ack->dl_qos_offset, ack->dl_qos_length );
  283.         
  284.     dprintf( "dl_qos_range_length = %d\n", ack->dl_qos_range_length);    /* available range of qos */
  285.     dprintf( "dl_qos_range_offset = %d\n", ack->dl_qos_range_offset);    /* offset from beg. of block*/
  286.     DumpAtOffset( ack, ack->dl_qos_range_offset, ack->dl_qos_range_length );
  287.         
  288.     dprintf( "dl_provider_style = %d\n", ack->dl_provider_style);        /* style1 or style2 */
  289.     dprintf( "dl_addr_offset = %d\n", ack->dl_addr_offset);         /* offset of the dlsap addr */
  290.     DumpAtOffset( ack, ack->dl_addr_offset, ack->dl_addr_length );
  291.     dprintf( "dl_version = %d\n", ack->dl_version);             /* version number */
  292.     
  293.     dprintf( "dl_brdcst_addr_length = %d\n", ack->dl_brdcst_addr_length);    /* length of broadcast addr */
  294.     dprintf( "dl_brdcst_addr_offset = %d\n", ack->dl_brdcst_addr_offset);    /* offset from beg. of block*/
  295.     DumpAtOffset( ack, ack->dl_brdcst_addr_offset, ack->dl_brdcst_addr_length );
  296.  
  297.     dprintf( "dl_growth = %d\n", ack->dl_growth);                /* set to zero */
  298.  
  299. }
  300.  
  301. void
  302. DLPIDump_DL_BIND_REQ(dl_bind_req_t *req)
  303. {
  304.     dprintf( "dl_sap = %d\n",  req->dl_sap);             /* info to identify dlsap addr*/
  305.     dprintf( "dl_max_conind = %d\n",  req->dl_max_conind);        /* max # of outstanding con_ind*/
  306.     dprintf( "dl_service_mode = %d\n",  req->dl_service_mode);    /* CO, CL or ACL */     
  307.     dprintf( "dl_conn_mgmt = %d\n",  req->dl_conn_mgmt);        /* if non-zero, is con-mgmt stream*/
  308.     dprintf( "dl_xidtest_flg = %d\n",  req->dl_xidtest_flg);     /* if set to 1 indicates automatic
  309.                                    initiation of test and xid frames */
  310.  
  311. void
  312. DLPIDump_DL_BIND_ACK(dl_bind_ack_t *ack)
  313. {
  314.     dprintf( "dl_sap = %d\n", ack-> dl_sap);             /* DLSAP addr info */
  315.     dprintf( "dl_addr_length = %d\n", ack-> dl_addr_length);     /* length of complete DLSAP addr */
  316.     dprintf( "dl_addr_offset = %d\n", ack-> dl_addr_offset);     /* offset from beginning of M_PCPROTO*/
  317.     DumpAtOffset( ack, ack->dl_addr_offset, ack->dl_addr_length );
  318.         
  319.     dprintf( "dl_max_conind = %d\n", ack-> dl_max_conind);        /* allowed max. # of con-ind */
  320.     dprintf( "dl_xidtest_flg = %d\n", ack-> dl_xidtest_flg);     /* responses supported by provider*/
  321.  
  322.  
  323. void
  324. DLPIDump_DL_SUBS_BIND_REQ(dl_subs_bind_req_t *req)
  325. {
  326.     dprintf( "dl_subs_sap_offset = %d\n",  req->dl_subs_sap_offset);             
  327.     dprintf( "dl_subs_sap_length = %d\n",  req->dl_subs_sap_length);        
  328.     DumpAtOffset( req, req->dl_subs_sap_offset, req->dl_subs_sap_length );
  329.     
  330.     dprintf( "dl_subs_bind_class = %d\n",  req->dl_subs_bind_class);         
  331.  
  332. void
  333. DLPIDump_DL_SUBS_BIND_ACK(dl_subs_bind_ack_t *ack)
  334. {
  335.     dprintf( "dl_subs_sap_offset = %d\n", ack-> dl_subs_sap_offset);     /* length of complete DLSAP addr */
  336.     dprintf( "dl_subs_sap_length = %d\n", ack-> dl_subs_sap_length);     /* offset from beginning of M_PCPROTO*/
  337.     DumpAtOffset( ack, ack->dl_subs_sap_offset, ack->dl_subs_sap_length );
  338.  
  339. void
  340. DLPIDump_DL_SUBS_UNBIND_REQ(dl_subs_unbind_req_t *ack)
  341. {
  342.     dprintf( "dl_subs_sap_offset = %d\n", ack-> dl_subs_sap_offset);     /* length of complete DLSAP addr */
  343.     dprintf( "dl_subs_sap_length = %d\n", ack-> dl_subs_sap_length);     /* offset from beginning of M_PCPROTO*/
  344.     DumpAtOffset( ack, ack->dl_subs_sap_offset, ack->dl_subs_sap_length );
  345.  
  346.  
  347.  
  348. void
  349. DLPIDump_DL_OK_ACK(dl_ok_ack_t *ack)
  350. {
  351.     dprintf( "dl_correct_primitive = %d\n", ack-> dl_correct_primitive);     
  352. }
  353.  
  354. void
  355. DLPIDump_DL_ENABMULTI_REQ(dl_enabmulti_req_t *ack)
  356. {
  357.     dprintf( "dl_addr_length = %d\n", ack-> dl_addr_length);     
  358.     dprintf( "dl_addr_offset = %d\n", ack-> dl_addr_offset);     
  359.     DumpAtOffset( ack, ack->dl_addr_offset, ack->dl_addr_length );
  360.  
  361. static void
  362. DLPIDump_dl_priority_t( dl_priority_t *priority )
  363. {
  364.     dprintf( "priority dl_min = %d\n", priority-> dl_min);     
  365.     dprintf( "priority dl_max = %d\n", priority-> dl_max);     
  366. }
  367.  
  368. void
  369. DLPIDump_DL_UNITDATA_REQ(dl_unitdata_req_t *ack)
  370. {
  371.     dprintf( "dl_dest_addr_length = %d\n", ack-> dl_dest_addr_length);     
  372.     dprintf( "dl_dest_addr_offset = %d\n", ack-> dl_dest_addr_offset);     
  373.     DumpAtOffset( ack, ack->dl_dest_addr_offset, ack->dl_dest_addr_length );
  374.  
  375.     DLPIDump_dl_priority_t( &ack->dl_priority );     
  376.  
  377. void
  378. DLPIDump_DL_UNITDATA_IND(dl_unitdata_ind_t *ack)
  379. {
  380.     dprintf( "dl_dest_addr_length = %d\n", ack-> dl_dest_addr_length);     
  381.     dprintf( "dl_dest_addr_offset = %d\n", ack-> dl_dest_addr_offset);     
  382.     DumpAtOffset( ack, ack->dl_dest_addr_offset, ack->dl_dest_addr_length );
  383.  
  384.     dprintf( "dl_src_addr_length = %d\n", ack-> dl_src_addr_length);     
  385.     dprintf( "dl_src_addr_offset = %d\n", ack-> dl_src_addr_offset);     
  386.     DumpAtOffset( ack, ack->dl_src_addr_offset, ack->dl_src_addr_length );
  387.  
  388.     dprintf( "dl_group_address = %d\n", ack-> dl_group_address);     
  389. }
  390.  
  391.  
  392. void
  393. DLPIDump_DL_ERROR_ACK(dl_error_ack_t *ack)
  394. {
  395.     dprintf( "dl_error_primitive = %s(%d)\n", 
  396.                     PrimitiveToString(ack-> dl_error_primitive),
  397.                     ack-> dl_error_primitive);     
  398.     dprintf( "dl_errno = %s(%d)\n", 
  399.                     ErrorAckCodeToString(ack-> dl_errno),
  400.                     ack-> dl_errno);     
  401.     dprintf( "dl_unix_errno = %d\n", ack-> dl_unix_errno);     
  402. }
  403.  
  404. void
  405. TIDump_T_INFO_ACK(T_info_ack *ack)
  406. {
  407.     dprintf( "TSDU_size = %d\n", ack->TSDU_size);        /* max TSDU size */
  408.     dprintf( "ETSDU_size = %d\n", ack->ETSDU_size);     /* max ETSDU size */
  409.     dprintf( "CDATA_size = %d\n", ack->CDATA_size);     /* connect data size */
  410.     dprintf( "DDATA_size = %d\n", ack->DDATA_size);     /* disconnect data size */
  411.     dprintf( "ADDR_size = %d\n", ack->ADDR_size);        /* TSAP size */
  412.     dprintf( "OPT_size = %d\n", ack->OPT_size);        /* options size */
  413.     dprintf( "TIDU_size = %d\n", ack->TIDU_size);        /* TIDU size */
  414.     dprintf( "SERV_type = %d\n", ack->SERV_type);        /* service type */
  415.     dprintf( "CURRENT_state = %d\n", ack->CURRENT_state);    /* current state */
  416.     dprintf( "PROVIDER_flag = %d\n", ack->PROVIDER_flag);    /* provider flags (see xti.h for defines) */
  417.  
  418. void
  419. TIDump_T_BIND_REQ(T_bind_req *ack)
  420. {
  421.     dprintf( "ADDR_length = %d\n", ack->ADDR_length);        /*  */
  422.     dprintf( "ADDR_offset = %d\n", ack->ADDR_offset);        /*  */
  423.     DumpAtOffset( ack, ack->ADDR_offset, ack->ADDR_length );
  424. }
  425.  
  426. void
  427. TIDump_T_BIND_ACK(T_bind_ack *ack)
  428. {
  429.     dprintf( "ADDR_length = %d\n", ack->ADDR_length);        /*  */
  430.     dprintf( "ADDR_offset = %d\n", ack->ADDR_offset);        /* */
  431.     DumpAtOffset( ack, ack->ADDR_offset, ack->ADDR_length );
  432. }
  433.  
  434. void
  435. TIDump_T_CONN_CON(T_conn_con *ack)
  436. {
  437.     dprintf( "RES_length = %d\n", ack->RES_length);        /*  */
  438.     dprintf( "RES_length = %d\n", ack->RES_length);        /* */
  439.     DumpAtOffset( ack, ack->RES_offset, ack->RES_length );
  440.  
  441.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  442.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  443.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  444. }
  445.  
  446. void
  447. TIDump_T_CONN_IND(T_conn_ind *ack)
  448. {
  449.     dprintf( "SRC_length = %d\n", ack->SRC_length);        /*  */
  450.     dprintf( "SRC_offset = %d\n", ack->SRC_offset);        /* */
  451.     DumpAtOffset( ack, ack->SRC_offset, ack->SRC_length );
  452.  
  453.  
  454.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  455.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  456.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  457. }
  458.  
  459. void
  460. TIDump_T_CONN_REQ(T_conn_req *ack)
  461. {
  462.     dprintf( "DEST_length = %d\n", ack->DEST_length);        /*  */
  463.     dprintf( "DEST_offset = %d\n", ack->DEST_offset);        /* */
  464.     DumpAtOffset( ack, ack->DEST_offset, ack->DEST_length );
  465.  
  466.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  467.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  468.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  469. }
  470.  
  471. void
  472. TIDump_T_CONN_RES(T_conn_res *ack)
  473. {
  474.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  475.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  476.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  477. }
  478.  
  479. void
  480. TIDump_T_OPTMGMT_ACK(T_optmgmt_ack *ack)
  481. {
  482.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  483.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  484.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  485.  
  486.     dprintf( "MGMT_flags = %d\n", ack->MGMT_flags);        /* */    
  487. }
  488.  
  489. void
  490. TIDump_T_OPTMGMT_REQ(T_optmgmt_req *ack)
  491. {
  492.     dprintf( "OPT_length = %d\n", ack->OPT_length);        /*  */
  493.     dprintf( "OPT_offset = %d\n", ack->OPT_offset);        /* */
  494.     DumpAtOffset( ack, ack->OPT_offset, ack->OPT_length );
  495.  
  496.     dprintf( "MGMT_flags = %d\n", ack->MGMT_flags);        /* */    
  497. }
  498.  
  499.  
  500. void
  501. TIDump_T_OK_ACK(T_ok_ack *ack)
  502. {
  503.     dprintf( "CORRECT_prim = (%s)%d\n", PrimitiveToString(ack->CORRECT_prim), ack->CORRECT_prim);        /*  */
  504. }
  505.  
  506.  
  507. long GetPrimitive(mblk_t* mp)
  508.     // GetPrimitive gets the TPI/DLPI primitive out of a message block.
  509.     // It returns kNoPrimitive if the message block is of the wrong
  510.     // type or there is no primitive.
  511.     //
  512.     // Environment: any standard STREAMS entry point
  513. {
  514.     if ((mp->b_datap->db_type == M_PROTO || mp->b_datap->db_type == M_PCPROTO) && MBLK_SIZE(mp) >= sizeof(long) ) {
  515.         return ( ( (union T_primitives*) mp->b_rptr)->type );
  516.     } else {
  517.         return ( kNoPrimitive );
  518.     }
  519. }
  520.  
  521. void
  522. MIDump_M_SETOPTS( struct stroptions *options )
  523. {
  524.     dprintf( "flags = %x\t", options->so_flags );
  525.     if ( options->so_flags == SO_ALL )
  526.         dprintf( "All flags" );
  527.     else
  528.         {
  529.         if ( options->so_flags & SO_READOPT )    dprintf( "Read Mode\t" );
  530.         if ( options->so_flags & SO_WROFF )        dprintf( "Write offset\t" );
  531.         if ( options->so_flags & SO_MINPSZ )    dprintf( "Min Packet Size\t" );
  532.         if ( options->so_flags & SO_MAXPSZ )    dprintf( "Max Packet Size\t" );
  533.         if ( options->so_flags & SO_HIWAT )        dprintf( "High water\t" );
  534.         if ( options->so_flags & SO_LOWAT )        dprintf( "Low water\t" );
  535.         if ( options->so_flags & SO_MREADON )    dprintf( "Request M_READ\t" );
  536.         if ( options->so_flags & SO_MREADOFF )    dprintf( "No M_READ\t" );
  537.         if ( options->so_flags & SO_NDELON )    dprintf( "Old O_NDELAY\t" );
  538.         if ( options->so_flags & SO_NDELOFF )    dprintf( "New O_NDELAY\t" );
  539.         if ( options->so_flags & SO_ISTTY )        dprintf( "Become controlling tty\t" );
  540.         if ( options->so_flags & SO_ISNTTY )    dprintf( "No longer controlling tty\t" );
  541.         if ( options->so_flags & SO_TOSTOP )    dprintf( "Stop on background writes\t" );
  542.         if ( options->so_flags & SO_TONSTOP )    dprintf( "Don't stop on background writes\t" );
  543.         if ( options->so_flags & SO_BAND )        dprintf( "Water marks band\t" );
  544.         if ( options->so_flags & SO_POLL_SET )    dprintf( "Set events\t" );
  545.         if ( options->so_flags & SO_POLL_CLR )    dprintf( "Clear events\t" );
  546.         }
  547.     dprintf( "\n" );
  548.     
  549.     dprintf( "so_wroff = %d\n", options->so_wroff);        /* write offset */
  550.     dprintf( "so_minpsz = %d\n", options->so_minpsz);        /* minimum read packet size */
  551.     dprintf( "so_maxpsz = %d\n", options->so_maxpsz);        /* maximum read packet size */
  552.     dprintf( "so_hiwat = %d\n", options->so_hiwat);        /* read queue high-water mark */
  553.     dprintf( "so_lowat = %d\n", options->so_lowat);        /* read queue low-water mark */
  554.     dprintf( "so_band = %d\n", options->so_band);         /* band for water marks */
  555.     dprintf( "so_poll_set = %d\n", options->so_poll_set);    /* poll events to set */
  556.     dprintf( "so_poll_clr = %d\n", options->so_poll_clr);    /* poll events to clear */
  557.         
  558. }
  559.  
  560. static void
  561. MIDump_Cred( cred_t *cred )
  562. {
  563.     if ( cred )
  564.         {
  565.         dprintf( "cr_ref = %d\n", cred->cr_ref );
  566.         dprintf( "cr_ngroups = %d\n", cred->cr_ngroups );
  567.         dprintf( "cr_uid = %d\n", cred->cr_uid );
  568.         dprintf( "cr_gid = %d\n", cred->cr_gid );
  569.         dprintf( "cr_ruid = %d\n", cred->cr_ruid );
  570.         dprintf( "cr_rgid = %d\n", cred->cr_rgid );
  571.         dprintf( "cr_suid = %d\n", cred->cr_suid );
  572.         dprintf( "cr_sgid = %d\n", cred->cr_sgid );
  573.         dprintf( "cr_groups[0] = %d\n", cred->cr_groups[0] );
  574.         }
  575.     else
  576.         dprintf( "cred is null\n" );
  577. }
  578.  
  579. void
  580. MIDump_M_IOCTL( struct iocblk *block)
  581. {
  582.     dprintf( "ioc_cmd = %x\n", block->ioc_cmd );
  583. //    MIDump_Cred( block->ioc_cr );
  584.     dprintf( "ioc_id = %d\n", block->ioc_id );
  585.     dprintf( "ioc_count = %d\n", block->ioc_count );
  586.     dprintf( "ioc_error = %d\n", block->ioc_error );
  587.     dprintf( "ioc_rval= %d\n", block->ioc_rval );
  588. }
  589.  
  590.  
  591.  
  592.  
  593. static void
  594. DumpIP( IPHeader *packet, Ptr end_packet )
  595. {
  596.     if ( end_packet < (char *)packet + sizeof(IPHeader) )
  597.         {dprintf( "short packet!!!\n" ); return;}
  598.     
  599.     dprintf( "IP:       Dest: %d.%d.%d.%d,  Source: %d.%d.%d.%d\n",
  600.                             packet->destAddr >> 24,
  601.                             (packet->destAddr >> 16) & 0xff,
  602.                             (packet->destAddr >> 8) & 0xff,
  603.                             (packet->destAddr) & 0xff,
  604.                             packet->sourceAddr >> 24,
  605.                             (packet->sourceAddr >> 16) & 0xff,
  606.                             (packet->sourceAddr >> 8) & 0xff,
  607.                             (packet->sourceAddr) & 0xff
  608.         );
  609.     
  610.     dprintf( "          ID: %x  Time-to-Live: %d, Total Length: %d\n",
  611.                             packet->id,
  612.                             packet->timeToLive,
  613.                             packet->totalLength
  614.         );
  615.                             
  616. }
  617.  
  618. static void
  619. DumpUDP( UDPPacket *packet, Ptr end_packet )
  620. {
  621.     dprintf( "\n\nUDP packet\n" );
  622.     
  623.     DumpIP( &packet->ipHeader, end_packet );
  624.     
  625.     if ( end_packet < (char *)packet + sizeof(UDPPacket) )
  626.         {dprintf( "short packet!!!\n" ); return;}
  627.     
  628.     dprintf( "UDP:       Dest: 0x%x  Source: 0x%x  Len:%d\n",
  629.                             packet->destPort,
  630.                             packet->sourcePort,
  631.                             packet->udpLength
  632.         );
  633.         
  634. }
  635.  
  636. static void
  637. DumpTCP( TCPPacket *packet, Ptr end_packet )
  638. {
  639.     dprintf( "\n\nTCP packet\n" );
  640.     
  641.     DumpIP( &packet->ipHeader, end_packet );
  642.     
  643.     if ( end_packet < (char *)packet + sizeof(TCPPacket) )
  644.         {dprintf( "short packet!!!\n" ); return;}
  645.     
  646.     dprintf( "TCP:       Dest: 0x%x  Source: 0x%x\n",
  647.                             packet->destPort,
  648.                             packet->sourcePort
  649.         );
  650.     dprintmem( (char *)packet + sizeof( TCPPacket ), packet->ipHeader.totalLength-sizeof(TCPPacket) );
  651.         
  652. }
  653.  
  654. static void
  655. DumpData( mblk_t *mp )
  656. {
  657.     char    *ptr, *end_ptr;
  658.     char    buffer[10240];
  659.     
  660.     ptr     = buffer;
  661.     while ( mp )
  662.         {
  663.         BlockMoveData( mp->b_rptr, ptr, mp->b_wptr - mp->b_rptr );
  664.         dprintf( "%d bytes in block\n", mp->b_wptr - mp->b_rptr );
  665.         ptr += ( mp->b_wptr - mp->b_rptr );
  666.         mp = mp->b_cont;
  667.         }
  668.     
  669.     end_ptr    = ptr;
  670.     ptr        = buffer;
  671.  
  672.     if ( ((IPHeader *)ptr)->versionAndHeaderLen == 0x45 )
  673.         switch( ((IPHeader *)ptr)->protocol )
  674.             {
  675.             case 0x06:
  676.                 DumpTCP( (TCPPacket *)ptr, end_ptr );
  677.                 break;
  678.             case 0x11:
  679.                 DumpUDP( (UDPPacket *)ptr, end_ptr );
  680.                 break;
  681.             default:
  682.                 dprintf( "Unknown packet type\n" );
  683.                 dprintmem( ptr, end_ptr-ptr );
  684.                 break;
  685.             }
  686.     else
  687.         {
  688.         dprintf( "versionAndHeaderLen == %x\n", ((IPHeader *)ptr)->versionAndHeaderLen );
  689.         dprintmem( ptr, end_ptr-ptr );
  690.         }
  691. }
  692.  
  693. void    Dump_Packet_Type( char *type, mblk_t *mp )
  694. {
  695. #ifdef dumpHeaders
  696.         dprintf( "=========\n%s with type %d (%s)\n\t===>primitive %d (%s)\n", 
  697.                                             type,
  698.                                             mp->b_datap->db_type,
  699.                                             TypeToString(mp->b_datap->db_type),
  700.                                             GetPrimitive(mp),
  701.                                             PrimitiveToString( GetPrimitive(mp) )
  702.                                             );
  703.  
  704. #endif
  705. }
  706.  
  707. void    Dump_Packet( mblk_t*mp )
  708. {
  709. #ifndef dumpDetails
  710. #pragma unused( mp )
  711. #else
  712.     do {
  713.         switch ( mp->b_datap->db_type )
  714.             {
  715. #ifdef dumpM_PROTO
  716.             case M_SETOPTS:
  717.                 MIDump_M_SETOPTS( (struct stroptions *)mp->b_rptr );
  718.                 break;
  719.             case M_IOCACK:
  720.             case M_IOCNAK:
  721.             case M_IOCTL:
  722.                 MIDump_M_IOCTL( (struct iocblk *)mp->b_rptr );
  723.                 break;
  724. #endif
  725.             case M_PCSIG:
  726.                 dprintmem( mp->b_rptr, mp->b_wptr - mp->b_rptr );
  727.                 if ( mp->b_cont )
  728.                     dprintf( "There was more\n" );
  729.                 break;
  730.             case M_FLUSH:
  731.                 dprintf( "Flushing the following (%x):", *mp->b_rptr );
  732.                 if ( *mp->b_rptr & FLUSHW )
  733.                     dprintf( " write queues" );
  734.                 if ( *mp->b_rptr & FLUSHR )
  735.                     dprintf( " read queues" );
  736.                 if ( *mp->b_rptr & FLUSHBAND )
  737.                     dprintf( "Band" );
  738.                 dprintf( "\n" );
  739.                 break;
  740.             case M_DATA:
  741. #ifdef dumpM_DATA
  742.                 DumpData( mp ); 
  743. #else
  744.                 dprintmem( mp->b_rptr, mp->b_wptr-mp->b_rptr );
  745. #endif
  746.                 break;
  747.             
  748. #ifdef dumpM_PROTO
  749.             case M_PROTO:
  750.             case M_PCPROTO:
  751.                 switch ( GetPrimitive(mp) )
  752.                     {
  753.                     case DL_INFO_ACK:        DLPIDump_DL_INFO_ACK( (dl_info_ack_t *)mp->b_rptr );    break;
  754.                     case DL_BIND_REQ:        DLPIDump_DL_BIND_REQ( (dl_bind_req_t *)mp->b_rptr );    break;
  755.                     case DL_BIND_ACK:        DLPIDump_DL_BIND_ACK( (dl_bind_ack_t *)mp->b_rptr );    break;
  756.                     case DL_SUBS_BIND_REQ:    DLPIDump_DL_SUBS_BIND_REQ( (dl_subs_bind_req_t *)mp->b_rptr );    break;
  757.                     case DL_SUBS_BIND_ACK:    DLPIDump_DL_SUBS_BIND_ACK( (dl_subs_bind_ack_t *)mp->b_rptr );    break;
  758.                     case DL_SUBS_UNBIND_REQ:DLPIDump_DL_SUBS_UNBIND_REQ( (dl_subs_unbind_req_t *)mp->b_rptr );    break;
  759.                     case DL_ENABMULTI_REQ:    DLPIDump_DL_ENABMULTI_REQ( (dl_enabmulti_req_t *)mp->b_rptr );    break;
  760.                     case DL_OK_ACK:            DLPIDump_DL_OK_ACK(  (dl_ok_ack_t *)mp->b_rptr );    break;
  761.                     case DL_UNITDATA_REQ:    DLPIDump_DL_UNITDATA_REQ(  (dl_unitdata_req_t *)mp->b_rptr );    break;
  762.                     case DL_UNITDATA_IND:    DLPIDump_DL_UNITDATA_IND(  (dl_unitdata_ind_t *)mp->b_rptr );    break;
  763.                     case DL_ERROR_ACK:        DLPIDump_DL_ERROR_ACK( (dl_error_ack_t *)mp->b_rptr );    break;
  764.  
  765.                     case T_INFO_ACK:    TIDump_T_INFO_ACK(  (T_info_ack *)mp->b_rptr );    break;
  766.                     case T_BIND_REQ:    TIDump_T_BIND_REQ(  (T_bind_req *)mp->b_rptr );    break;
  767.                     case T_BIND_ACK:    TIDump_T_BIND_ACK(  (T_bind_ack *)mp->b_rptr );    break;
  768.                     case T_CONN_CON:    TIDump_T_CONN_CON(  (T_conn_con *)mp->b_rptr );    break;
  769.                     case T_CONN_IND:    TIDump_T_CONN_IND(  (T_conn_ind *)mp->b_rptr );    break;
  770.                     case T_CONN_REQ:    TIDump_T_CONN_REQ(  (T_conn_req *)mp->b_rptr );    break;
  771.                     case T_CONN_RES:    TIDump_T_CONN_RES(  (T_conn_res *)mp->b_rptr );    break;
  772.                     case T_OPTMGMT_ACK:    TIDump_T_OPTMGMT_ACK(  (T_optmgmt_ack *)mp->b_rptr );    break;
  773.                     case T_OPTMGMT_REQ:    TIDump_T_OPTMGMT_REQ(  (T_optmgmt_req *)mp->b_rptr );    break;
  774.                     case T_OK_ACK:        TIDump_T_OK_ACK(      (T_ok_ack *)mp->b_rptr );    break;
  775.                     }
  776.                 break;
  777. #endif
  778.             }
  779.         } while ( (mp = mp->b_cont) != 0 );
  780. #endif
  781. }
  782.